#if !defined(FAKE_D3D11_DEVICE_CHILD_H)
#define FAKE_D3D11_DEVICE_CHILD_H

#include <rt/Exceptions/NotImplementedException.h>
#include "Fakes/FakeUnknown.h"

class FakeD3D11DeviceChild : public ID3D11DeviceChild
{
public:
	FakeD3D11DeviceChild()
		: Unknown()
	{
	}

	CONTAIN_UNKNOWN(Unknown)

	// ID3D11DeviceChild
	virtual void STDMETHODCALLTYPE GetDevice(ID3D11Device **ppDevice) { throw rt::NotImplementedException(); }
	virtual HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID guid, UINT *pDataSize, void *pData) { throw rt::NotImplementedException(); }
	virtual HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID guid, UINT DataSize, const void *pData) { throw rt::NotImplementedException(); }
	virtual HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID guid, const IUnknown *pData) { throw rt::NotImplementedException(); }
};

#define CONTAIN_DEVICE_CHILD(member_) \
	CONTAIN_UNKNOWN(Unknown) \
	FakeD3D11DeviceChild member_; \
	virtual void STDMETHODCALLTYPE GetDevice(ID3D11Device **ppDevice) { return member_.GetDevice(ppDevice); } \
	virtual HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID guid, UINT *pDataSize, void *pData) { return member_.GetPrivateData(guid, pDataSize, pData); } \
	virtual HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID guid, UINT DataSize, const void *pData) { return member_.SetPrivateData(guid, DataSize, pData); } \
	virtual HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID guid, const IUnknown *pData) { return member_.SetPrivateDataInterface(guid, pData); }

#endif
